package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.AcaoDAO;
import br.com.duosoftware.orcamento.daos.ProgramaPeriodoDAO;
import br.com.duosoftware.orcamento.entidades.Acao;
import br.com.duosoftware.orcamento.entidades.PeriodoDePrograma;
import br.com.duosoftware.orcamento.entidades.Programa;
import br.com.duosoftware.orcamento.entidades.ProgramaPeriodo;
import br.com.duosoftware.orcamento.utils.ManagedBeanUtil;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class ProgramaPeriodoBean implements Serializable {

    private ProgramaPeriodo programaPeriodo;
    private List<ProgramaPeriodo> programasPeriodo;
    private ProgramaPeriodoDAO programaPeriodoDAO;
    //
    private ProgramaBean programaBean;

    public ProgramaPeriodoBean() {
        
        programaPeriodo = new ProgramaPeriodo();
        
        programaPeriodo.setPeriodoDePrograma(new PeriodoDePrograma());
        
        programaPeriodoDAO = new ProgramaPeriodoDAO();

        programaBean = (ProgramaBean) ManagedBeanUtil.getContextInfo("#{programaBean}");

    }

    public ProgramaPeriodo getProgramaPeriodo() {
        return programaPeriodo;
    }

    public void setProgramaPeriodo(ProgramaPeriodo programaPeriodo) {
        this.programaPeriodo = programaPeriodo;
    }

    public List<ProgramaPeriodo> getProgramasPeriodo() {
        return programasPeriodo;
    }

    public void setProgramasPeriodo(List<ProgramaPeriodo> programasPeriodo) {
        this.programasPeriodo = programasPeriodo;
    }

    public void buscarPeriodosPorPrograma() {

        Programa programa = programaBean.getPrograma();

        if (programa != null && programa.getId() != null) {

            programasPeriodo = programaPeriodoDAO
                    .listarProgramasPeriodos(programa);

        } else {
            programasPeriodo = null;
        }

        /*
        
         faz com que a tabela de Ações, na página Programa.xhtml seja limpada,
         caso não seja retornada nenhum Período
        
         */

        if (programasPeriodo == null || programasPeriodo.isEmpty()) {
            programaPeriodo = new ProgramaPeriodo();
        }

    }

    public void adicionarInicio() {

        Programa programa = programaBean.getPrograma();
        
        programaPeriodo = new ProgramaPeriodo();
        
        if (programa == null) {

            Mensagens.mensagemDeAlerta("Selecione um programa",
                    "Selecione um programa adicionar um período");

        } else {

            programaPeriodo.setPrograma(programa);

            RequestContext.getCurrentInstance()
                    .execute("dlgAddProgramaPeriodo.show()");

        }

    }

    public void adicionarEditarFim() {

        if (programaPeriodo.getPeriodoDePrograma() == null) {

            Mensagens.mensagemDeAlerta("Selecione um período",
                    "Selecione um período");

        } else {

            if (!programaPeriodoDAO.verificarSeExiste(programaPeriodo)) {

                programaPeriodoDAO.salvarOuAtualizar(programaPeriodo);
                programaPeriodo = new ProgramaPeriodo();

                RequestContext.getCurrentInstance()
                        .execute("dlgAddProgramaPeriodo.hide()");

                buscarPeriodosPorPrograma();

            } else {

                Mensagens.mensagemDeAlerta("Não permitido",
                        "Esse programa já possui esse período");

            }
        }

    }

    public void editarInicio() {

        if (programaPeriodo == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um "
                    + "registro para editar");

        }

    }

    public void excluirInicio() {
        if (programaPeriodo == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um "
                    + "registro para excluir");
        } else {
            RequestContext.getCurrentInstance().execute("dlgExcluirProgramaPeriodo.show()");
        }
    }

    public void excluirFim() {
        try {

            Programa programa = programaPeriodo.getPrograma();

            List<Acao> acoes = new AcaoDAO().listarAcoes(programa, programaPeriodo.getPeriodoDePrograma());

            if (acoes == null || !acoes.isEmpty()) {
                Mensagens.mensagemDeAlerta("Não é possível excluir", "Existem ações que dependem desse período");
                return;
            }

            programaPeriodoDAO.excluir(programaPeriodo);
            programaPeriodo = new ProgramaPeriodo();
            programasPeriodo = null;
            
            buscarPeriodosPorPrograma();
            
            RequestContext.getCurrentInstance().execute("excluirProgramaPeriodo.hide()");

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Não é possível excluir",
                    "Esse registro está sendo utilizado");
        }

    }
    
    public void cancelar() {
        programaPeriodo = new ProgramaPeriodo();
    }
    
}
